package net.lulihu.pangolin.headless.server.handler;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.handler.timeout.IdleStateHandler;
import lombok.extern.slf4j.Slf4j;

/**
 * 空闲通道检查程序
 */
@Slf4j
public class IdleStateCheckHandler extends IdleStateHandler {

    // 读时间
    private static final int READER_IDLE_TIME = 30;

    public IdleStateCheckHandler() {
        this(READER_IDLE_TIME, 0, 0);
    }

    /**
     * @param readerIdleTimeSeconds 在指定的时间段内未执行读取时，将触发状态为IdleState.READER_IDLE的IdleStateEvent。 指定0以禁用
     * @param writerIdleTimeSeconds 在指定的时间段内未执行写入时将触发状态为IdleState.WRITER_IDLE的IdleStateEvent。 指定0以禁用
     * @param allIdleTimeSeconds    状态为IdleState.ALL_IDLE的IdleStateEvent将在指定的时间段内未执行读取或写入时触发。 指定0以禁用
     */
    public IdleStateCheckHandler(int readerIdleTimeSeconds, int writerIdleTimeSeconds, int allIdleTimeSeconds) {
        super(readerIdleTimeSeconds, writerIdleTimeSeconds, allIdleTimeSeconds);
    }

    @Override
    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {
        if (IdleState.READER_IDLE == evt.state()) {
            ctx.channel().close();
        }
    }
}
